package ljl.alg.wangzheng_camp.round1.find_the_law;

/**
 * 棋盘大小 n 不固定
 * <p>
 * 行、列、对角线相同者胜
 * 有空位，pending
 * 满了，没人胜，draw
 * <p>
 * 输入： board = ["O X"," XO","X O"]
 * 输出： "X"
 * <p>
 * 输入： board = ["OOX","XXO","OXO"]
 * 输出： "Draw"
 * 解释： 没有玩家获胜且不存在空位
 * <p>
 * 输入： board = ["OOX","XXO","OX "]
 * 输出： "Pending"
 * 解释： 没有玩家获胜且仍存在空位
 *
 * 这个题很奇怪，如果长度是偶数，就没有对角线了，怎么办
 * 那就认为对角线上是 0 吧
 *
 * 咋没对角线啊，我是呆逼
 * 1 1
 * 1 1 这不是对角线？
 *
 */
public class _16_04_tictactoe {
    
    /**
     * 发现空格假定是 pending，还得找有没有胜者
     * 找到最后没有胜者，之前也不是 pending，就是 draw
     * 发现胜者自然就返回胜者了
     *
     * 要检查 n 行 n 列和两个对角线
     *
     * 通过了。。
     * 可以看出，这代码还是稍微有点长的
     * 难是不难，就是恶心！
     *
     * 别看我的长，还写错好几次
     *
     */
    public String tictactoe2(String[] board) {
        int n = board.length;
        
        String res = null;
        int dia1 = 0, dia2 = 0;
        char diaChar = 0, diaChar1 = 0;
        for (int i = 0; i < n; i++) {
            int rowCount = 0;
            char c = 0;
            String line = board[i];
            for (int j = 0; j < n; j++) {
                // 看不是有空格
                if (line.charAt(j) == ' ') {
                    res = "Pending";
                }
                // 数每行是不是都一样
                if (c == 0) {
                    c = line.charAt(j);
                    rowCount++;
                } else if (c == line.charAt(j)) {
                    rowCount++;
                }
                // 看每列是不是一样，这个循环不行，得竖着遍历
                
                // 看对角线
                if (diaChar == 0 && i == 0 && j == 0) {
                    diaChar = line.charAt(0);
                    dia1++;
                } else if (line.charAt(j) == diaChar && i == j) {
                    dia1++;
                }
                
                // 左对角线
                if (diaChar1 == 0 && j == n - 1 && i == 0) {
                    diaChar1 = line.charAt(n - 1);
                    dia2++;
                } else if (line.charAt(j) == diaChar1 && i + j == n - 1)
                    dia2++;
            }
            if (rowCount == n && c != ' ')
                return String.valueOf(c);
        }
        if (dia1 == n && diaChar != ' ') return String.valueOf(diaChar);
        if (dia2 == n && diaChar1 != ' ') return String.valueOf(diaChar1);
        
        // 两个对角线和每行都不同，最后看看列
        // 行可以同时检查列，但是你那把行声明出来了，限制了你的思维
        for (int i = 0; i < n; i++) {
            char c = 0;
            int count = 0;
            for (String s : board) {
                if (c == 0) {
                    c = s.charAt(i);
                    count++;
                } else if (s.charAt(i) == c) {
                    count++;
                }
            }
            if (count == n && c != ' ')
                return String.valueOf(c);
        }
    
        return res == null ? "Draw" : res;
    }
    
    /**
     * 根据我的经验，一般人写的都比我好
     * 看看别人怎么写的
     *
     * 利用了求和，比较鸡贼
     *
     * 太猥琐了
     * 别人总是比我聪明
     *
     * 比我的简洁太多了
     *
     * */
    public String tictactoe(String[] board) {
        int n = board.length;
        final int allX = 'X' * n, allO = 'O' * n;
        int left = 0, right = 0;
        boolean hasSpace = false;
    
        for (int i = 0; i < n; i++) {
            int row = 0, col = 0;
            for (int j = 0; j < n; j++) {
                row += board[i].charAt(j);
                col += board[j].charAt(i);
                if(board[i].charAt(j) == ' ') hasSpace = true;
            }
            if (row == allX || col == allX) return "X";
            if (row == allO || col == allO) return "O";
            
            left += board[i].charAt(i);
            right += board[i].charAt(n - i - 1);
        }
        
        if (left == allX || right == allX) return "X";
        if (left == allO || right == allO) return "O";
        if (hasSpace) return "Pending";
        return "Draw";
    }
}
